package cn.bugstack.infrastructure.dao;

import cn.bugstack.infrastructure.dao.po.GroupBuyActivity;
import cn.bugstack.infrastructure.dao.po.GroupBuyOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @description 用户拼单
 */
@Mapper
public interface IGroupBuyOrderDao {

    // 首次拼团组队时，插入拼团的组队信息
    void insert(GroupBuyOrder groupBuyOrder);

    // 后续用户参加拼团的组队时，增加队伍的锁单量
    int updateAddLockCount(String teamId);

    // 用户取消拼团或者超时未支付，减少队伍的锁单量，释放订单
    int updateSubtractionLockCount(String teamId);

    // 查询拼团组队的进展
    GroupBuyOrder queryGroupBuyProgress(String teamId);

    // 查询拼团的组队信息
    GroupBuyOrder queryGroupBuyTeamByTeamId(String teamId);

    // 批量查询在范围内的拼团队伍
    List<GroupBuyOrder> queryGroupBuyTeamByTeamIds(@Param("teamIds") Set<String> teamIds);

    // 拼团组队的完成数量 + 1
    int updateAddCompleteCount(String teamId);

    // 将 拼单中的 组队更改成拼单成功
    int updateOrderStatus2COMPLETE(String teamId);

    // 根据 teamId 批量检查拼团队伍的完成进度, 返回处于拼团中且, 锁单量小于目标量的
    List<GroupBuyOrder> queryGroupBuyProgressByTeamIds(@Param("teamIds") Set<String> teamIds);

    // 统计拼团队伍的数量, 集合中的id 有多少在表中, 是有效的
    Integer queryAllTeamCount(@Param("teamIds") Set<String> teamIds);

    // 统计拼团完成队伍的数量, 集合中的id 有多少是已经完成的
    Integer queryAllTeamCompleteCount(@Param("teamIds") Set<String> teamIds);

    // 查询所有 一个商品的总参团人数，所有拼团队伍的锁单总量
    Integer queryAllUserCount(@Param("teamIds") Set<String> teamIds);

    // 未支付，未成团：更新 拼单中 的队伍的锁单量-1
    int unpaid2Refund(GroupBuyOrder groupBuyOrderReq);

    // 已支付，未成团：更新 拼单中 的队伍锁单量-1 完成量-1
    int paid2Refund(GroupBuyOrder groupBuyOrderReq);

    // 已支付，已成团(订单数量>1)：更新 完成队伍 锁单量-1 完成量-1，状态更新为 完成(含退单)
    int paidTeam2Refund(GroupBuyOrder groupBuyOrderReq);

    // 已支付，已成团(订单数量=1)：更新 完成队伍 锁单量-1 完成量-1，状态更新为 失败
    int paidTeam2RefundFail(GroupBuyOrder groupBuyOrderReq);
}
